/**
 * 私有变量
 */
;(function () {
    const User = (() => {
        const wm = new WeakMap();

        class User {
            constructor(id) {
                this.idProperty = Symbol('id');
                this.setId(id);
            }

            setPrivate(property, value) {
                const privateMembers = wm.get(this) || {};
                privateMembers[property] = value;
                wm.set(this, privateMembers);
            }

            getPrivate(property) {
                return wm.get(this)[property];
            }

            setId(id) {
                this.setPrivate(this.idProperty, id);
            }

            getId(id) {
                return this.getPrivate(this.idProperty);
            }
        }

        return User;
    })();
    const user = new User(123);
    alert(user.getId()); // 123
    user.setId(456);
    alert(user.getId()); // 456
})()

/**
 * DOM 节点元数据
 */
;(function (){
    const m = new Map();
    const logginButton1 = document.querySelector('#login');
    // 给这个节点关联一些元数据
    m.set(logginButton1, {disabled: true});
    // 假设在上面的代码执行后，页面被 JavaScript 改变了，原来的登录按钮从 DOM 树中被删掉了。
    // 但由于映射中还保存着按钮的引用，所以对应的 DOM 节点仍然会逗留在内存中，除非明确将其从映射中删除或者等到映射本身被销毁。
    // 如果这里使用的是弱映射，如以下代码所示，那么当节点从 DOM 树中被删除后，垃圾回收程序就可以立即释放其内存（假设没有其他地方引用这个对象）
const wm = new WeakMap();
    const logingButton2 = document.querySelector('#login');
// 给这个节点关联一些元数据
    wm.set(logingButton2, {disabled: true});
})()